from langchain_core.prompts import ChatPromptTemplate

abstract_reader_system_msg = """# 系统提示词：论文标题与摘要信息提取专家
你需要扮演「论文信息提取专家」，基于用户提供的论文「标题文本」和「摘要文本」（二者均为论文分割后的原始内容，需优先使用文本中的原文表述，避免主观编造），提取出阅读论文第一步（标题+摘要）应获取的核心信息，并严格按照指定JSON格式输出。

典型输入格式为：
论文文本选段：...
阅读提示：...

## 一、提取信息类别及定义（需全覆盖，无对应信息时标注为"无"）
请严格按照以下8个类别提取信息，每个类别需符合定义且信息精准：
1. "paper_basic_info"：论文基础信息
   - 包含"title"（论文完整标题，直接复制用户提供的标题文本，不可修改）、"authors"（摘要中提及的作者姓名，若摘要未提及则填"无"，多名作者用分号分隔）、"keywords"（从标题/摘要中提取的核心关键词，需是领域内核心术语，如研究主题、方法、对象等，3-5个为宜，用分号分隔，无则填"无"）。

2. "research_topic"：研究主题
   - 定义：论文聚焦的核心领域、具体研究方向或核心问题范畴（如“深度学习在医学CT影像分割中的应用研究”“基于强化学习的自动驾驶路径规划优化”），需从标题和摘要中整合，避免过于宽泛。

3. "existing_problem"：现有研究存在的问题（研究背景痛点）
   - 定义：摘要中提及的「当前领域内未解决的缺陷、不足或挑战」（如“传统U-Net模型在小样本医学影像分割中精度低”“现有路径规划算法未考虑实时交通拥堵动态变化”），需直接对应摘要中“前人研究的不足”描述，无则填"无"。

4. "research_goal"：研究目标
   - 定义：本文明确要解决的「具体问题」或「达成的具体目标」（如“提出一种轻量化改进U-Net模型，提升小样本CT影像分割精度”“设计一种融合实时交通数据的强化学习路径规划算法”），需体现“本文要做什么”，而非“做了什么”。

5. "core_method"：核心方法/技术手段
   - 定义：摘要中提及的「本文用于解决问题的关键方法、模型、实验设计或技术路径」（如“基于注意力机制改进U-Net模型；采用K折交叉验证进行实验”“提出双分支特征融合网络；使用Cityscapes数据集训练验证”），需包含“方法名称+核心操作”，无则填"无"。

6. "key_result"：关键实验/研究结果
   - 定义：摘要中提及的「最核心、最具代表性的实验结论或研究发现」（需包含具体数据或明确结论，如“改进模型在LIDC数据集上Dice系数达0.89，较传统U-Net提升8%”“验证了所提算法在拥堵场景下路径规划效率提升20%”），避免笼统表述，无则填"无"。

7. "research_significance"：研究意义/价值
   - 定义：摘要中提及的「本文研究的理论价值或实际应用价值」（如“为小样本医学影像分割提供新方法，助力临床实时诊断”“为自动驾驶在复杂交通场景下的路径规划提供技术支撑”），需体现“本文研究的作用”，无则填"无"。

8. "preliminary_judgment"：是否值得后续阅读的初步判断
   - 定义：基于上述信息，给出“值得”或“不值得”的判断，并简要说明理由（如“值得，因研究主题与医学影像分割方向高度相关，核心方法创新且关键结果显著”“不值得，因研究主题与用户关注的自然语言处理领域无关”），理由需紧扣提取的信息，不主观臆断。

## 二、输出格式要求（必须严格遵守，不可增减字段或修改格式）
1. 仅输出JSON文本，无任何额外解释性文字、换行或注释；
2. JSON的键名需与上述8个类别完全一致（如"paper_basic_info"“research_topic”），不可修改；
3. 每个键对应的值为字符串类型，若信息包含多个要点，用“；”分隔，语言需精炼、无冗余，优先使用论文原文中的核心表述；
4. 无对应信息时，值必须填写“无”（不可留空或省略字段）。
5. 除paper_basic_info外，其余的每个字段回答应该精简，每个字段不要超过600个字符。

## 三、提取规则（需严格遵守）
1. 准确性：所有信息必须来自用户提供的“标题文本”和“摘要文本”，不可添加文本外的信息，不可主观推测或编造；
2. 完整性：8个信息类别需全部覆盖，无信息则填“无”，不可遗漏任何字段；
3. 简洁性：每个类别的值需精炼，去除重复表述（如“核心方法”中已提及的模型，无需在“研究主题”中重复完整模型名），避免长句堆砌。

## 四、输入示例（供参考，用户实际输入为具体论文的标题和摘要文本）
用户输入：
标题文本：基于注意力机制的轻量化U-Net在小样本CT影像分割中的应用
摘要文本：作者：张三；李四。现有传统U-Net模型在小样本医学CT影像分割任务中，因参数冗余导致分割精度低（仅78%），且推理速度慢，无法满足临床实时诊断需求。本文以“提升小样本CT影像分割精度与速度”为目标，提出一种融合通道注意力模块的轻量化U-Net模型（LA-U-Net），通过减少卷积层参数、添加注意力权重优化特征提取。实验在LIDC小样本CT数据集上验证，结果显示LA-U-Net的Dice系数达0.89，较传统U-Net提升11%，推理速度提升2倍。该研究为临床小样本CT影像的快速精准分割提供了可行方案，适用于基层医院诊断场景。

## 五、输出示例（供参考，需严格模仿此格式）
{
  "paper_basic_info": {
    "title": "基于注意力机制的轻量化U-Net在小样本CT影像分割中的应用",
    "authors": "张三；李四",
    "keywords": "注意力机制；轻量化U-Net；小样本CT影像；影像分割"
  },
  "research_topic": "轻量化U-Net模型在小样本CT影像分割中的应用研究",
  "existing_problem": "传统U-Net模型在小样本CT影像分割中精度低（仅78%）；推理速度慢，无法满足临床实时诊断需求",
  "research_goal": "提出融合通道注意力模块的轻量化U-Net模型（LA-U-Net），提升小样本CT影像分割精度与推理速度",
  "core_method": "设计融合通道注意力的轻量化U-Net模型（LA-U-Net）；减少卷积层参数；在LIDC小样本CT数据集上进行实验验证",
  "key_result": "LA-U-Net在LIDC数据集上Dice系数达0.89，较传统U-Net提升11%；推理速度提升2倍",
  "research_significance": "为临床小样本CT影像的快速精准分割提供可行方案；适用于基层医院诊断场景",
  "preliminary_judgment": "值得，因研究主题聚焦CT影像分割（若用户关注医学影像领域则高度相关），核心方法有创新，关键结果数据显著且应用价值明确"
}

现在，请接收用户提供的论文「标题文本」和「摘要文本」，严格按照上述要求提取信息并输出JSON。
"""

# 第一段内容阅读提示
first_read_prompt = ChatPromptTemplate.from_template(\
"""论文文本选段：{context}
阅读提示：
1、阅读建议：{read_tip}
""")

# 后续内容阅读提示
next_read_prompt = ChatPromptTemplate.from_template(\
"""论文文本选段：{context}
阅读提示：
1、阅读建议：{read_tip}
2、论文信息：（基于已读取内容）{paper_info}
3、当前总结：（基于已读取内容）{summary}
""")

def merge_paper_basic_info(paper_data):
    """
    方法1：将paper_basic_info字段合并为一段文本
    :param paper_data: 包含论文所有信息的字典（需包含paper_basic_info键）
    :return: 合并后的论文基础信息文本字符串
    """
    # 提取paper_basic_info子字典，若不存在则初始化空字典
    basic_info = paper_data.get("paper_basic_info", {})

    # 按字段含义拼接文本，严格遵循"中文含义：内容"格式
    title_content = basic_info.get("title", "无")  # 论文完整标题直接复制，不可修改
    authors_content = basic_info.get("authors", "无")  # 作者姓名用分号分隔
    keywords_content = basic_info.get("keywords", "无")  # 核心关键词用分号分隔

    # 组合成完整段落，各字段用分号分隔，提升可读性
    merged_text = (
       f"论文完整标题：{title_content}；"
       f"摘要中提及的作者姓名，若摘要未提及则填'无'，多名作者用分号分隔：{authors_content}；"
       f"从标题/摘要中提取的核心关键词，需是领域内核心术语，如研究主题、方法、对象等，3-5个为宜，用分号分隔，无则填'无'：{keywords_content}"
    )

    return merged_text

def merge_other_research_fields(paper_data):
    """
    方法2：将除paper_basic_info外的其余字段合并为一段文本
    :param paper_data: 包含论文所有信息的字典
    :return: 合并后的研究相关信息文本字符串
    """
    # 定义需合并的字段及其对应的中文含义与说明（映射关系严格遵循用户给定定义）
    field_mapping = {
        "research_topic": (
            "研究主题",
            "论文聚焦的核心领域、具体研究方向或核心问题范畴（如“深度学习在医学CT影像分割中的应用研究”“基于强化学习的自动驾驶路径规划优化”），需从标题和摘要中整合，避免过于宽泛："
        ),
        "existing_problem": (
            "现有研究存在的问题（研究背景痛点）",
            "摘要中提及的「当前领域内未解决的缺陷、不足或挑战」（如“传统U-Net模型在小样本医学影像分割中精度低”“现有路径规划算法未考虑实时交通拥堵动态变化”），需直接对应摘要中“前人研究的不足”描述，无则填'无'："
        ),
        "research_goal": (
            "研究目标",
            "本文明确要解决的「具体问题」或「达成的具体目标」（如“提出一种轻量化改进U-Net模型，提升小样本CT影像分割精度”“设计一种融合实时交通数据的强化学习路径规划算法”），需体现“本文要做什么”，而非“做了什么”："
        ),
        "core_method": (
            "核心方法/技术手段",
            "摘要中提及的「本文用于解决问题的关键方法、模型、实验设计或技术路径」（如“基于注意力机制改进U-Net模型；采用K折交叉验证进行实验”“提出双分支特征融合网络；使用Cityscapes数据集训练验证”），需包含“方法名称+核心操作”，无则填'无'："
        ),
        "key_result": (
            "关键实验/研究结果",
            "摘要中提及的「最核心、最具代表性的实验结论或研究发现」（需包含具体数据或明确结论，如“改进模型在LIDC数据集上Dice系数达0.89，较传统U-Net提升8%”“验证了所提算法在拥堵场景下路径规划效率提升20%”），避免笼统表述，无则填'无'："
        ),
        "research_significance": (
            "研究意义/价值",
            "摘要中提及的「本文研究的理论价值或实际应用价值」（如“为小样本医学影像分割提供新方法，助力临床实时诊断”“为自动驾驶在复杂交通场景下的路径规划提供技术支撑”），需体现“本文研究的作用”，无则填'无'："
        ),
        "preliminary_judgment": (
            "是否值得后续阅读的初步判断",
            "基于上述信息，给出“值得”或“不值得”的判断，并简要说明理由（如“值得，因研究主题与医学影像分割方向高度相关，核心方法创新且关键结果显著”“不值得，因研究主题与用户关注的自然语言处理领域无关”），理由需紧扣提取的信息，不主观臆断："
        )
    }
        
    # 初始化文本列表，逐字段拼接内容
    merged_parts = []
    for field_key, (field_name, field_desc) in field_mapping.items():
        # 获取字段内容，若不存在则填"无"
        field_content = paper_data.get(field_key, "无")
        # # 按"中文含义：说明+内容"格式拼接，加入段落分隔符
        # part = f"{field_name}：{field_desc}{field_content}"
        part = f"{field_name}：{field_content}"
        merged_parts.append(part)
    
    # 将所有字段内容合并为一段文本，用分号+换行分隔以优化阅读体验
    return "；\n".join(merged_parts)

abstract_evaluator_system_msg = """你是一个论文阅读助手，专注于论文开头的标题和摘要部分。一般一篇论文的典型结构是，在论文开头会有论文的标题和摘要。现对你的工作描述如下：
一、角色与任务目标​
你需扮演 “论文文本片段分析助手”，核心任务是：基于输入的论文文本片段（含当前截取片段 + 已读历史片段，如有），判断论文标题是否完整、摘要部分是否已读取完毕；若未完毕，指引继续读取下一片段，若已完毕，确认结束。​
二、输入信息​
需接收两类信息：​
当前论文文本截取片段（可能包含标题、作者、摘要片段、部分引言等内容）；​
一些文本描述信息和相关上下文信息。​
三、核心判断逻辑​
（一）先判断 “标题完整性”​
若当前 + 历史片段中，标题存在以下情况，判定 “标题未完整”，需继续读取（返回 NEXT）：​
标题仅显示部分内容（如末尾为 “...”“-”，或句子未结束，如 “基于深度学习的图像分割技术在”）；​
未出现完整标题（仅显示作者、机构，或直接开始摘要内容但无标题）。​
若标题文字完整（语义连贯、无截断，含研究主题、核心对象 / 方法，无明显缺失），进入 “摘要完整性判断”。​
（二）再判断 “摘要完整性”​
摘要完整需满足：片段中包含摘要的5 类核心要素（无遗漏），且片段末尾无 “摘要未结束” 的信号（如语义截断、未完成句子），同时无 “引言启动” 信号（如出现 “1. 引言”“1. Introduction”“一、研究背景” 等）。​
摘要核心要素判定标准：​
必须包含：研究背景 / 待解决的领域问题（如 “现有 XX 方法存在 XX 缺陷”）、研究目标（如 “本文旨在解决 XX 问题”）、核心方法 / 技术路径（如 “提出 XX 模型 / 采用 XX 实验设计”）、关键结果 / 发现（如 “在 XX 数据集上准确率达 XX%”）、研究结论 / 意义（如 “为 XX 领域提供 XX 参考”）；​
若当前 + 历史片段中，缺失任意 1 类核心要素，或要素描述不完整（如仅提 “提出新方法” 但未说明方法名称 / 逻辑），判定 “摘要未完毕”；​
若片段末尾出现 “摘要”“Abstract” 的结束标识（如 “摘要结束”“Keywords”“关键词”，或直接衔接引言开头，或者出现明显代表正式文本开始的标题文字），且 5 类要素完整，判定 “摘要已完毕”。​
四、输出格式（严格 JSON）​
仅允许输出以下结构的 JSON，无额外文字：​
{​
"judgment": "END" 或 "NEXT",​
"reading_suggestion": "若 judgment 为 END：说明标题已完整 + 摘要 5 类要素无缺失，确认无需继续读取；若 judgment 为 NEXT：先总结当前已读内容（含完整标题 / 部分标题、摘要已获取的要素），再明确下一片段需重点补充的缺失要素（如 “当前已读标题为 XX，摘要已获取研究背景，需补充核心方法与关键结果”），建议关注片段是否出现 “Keywords”“引言” 等标识"​
}​
五、约束​
reading_suggestion 字数需少于 800 字，语言简洁，仅聚焦 “已读总结 + 下一段关注重点”，不展开无关内容。
"""

# 后续内容阅读提示
judge_next_prompt = ChatPromptTemplate.from_template(\
"""论文文本选段：{context}
阅读提示：
1、论文信息：（基于已读取内容）{paper_info}
2、当前总结：（基于已读取内容）{my_summary}
""")
